﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class PessoaAfastamento
    {
        #region Variaveis Membro
        /*
        Motivo - TipoMotivoAfastamento.Descricao
        Afastamento - TipoAfastamento.Descricao
        DataInicio - PeriodoInicial
        DataPrevisãoTermino - PeriodoFinal
        Hora Inicio - PeriodoInicial
        Hora Termino - PeriodoFinal
        TerminoReal - PeriodoFinalReal
        Observacao - Observacoes
         */
        private int _idAfastamento;
        private int _idPessoa;
        private TipoAfastamento _tipoAfastamento;
        private TipoMotivoAfastamento _motivoAfastamento;
        private DateTime? _periodoInicial;
        private DateTime? _periodoFinal;
        private DateTime? _periodoFinalReal;
        private string _path;
        private string _observacoes;
        private int _idAtestadoPai;
        private const int _idTipoAfastamento = 16;
        private GENTEEntities _context;
        #endregion

        #region Propriedades
        public int IdAfastamento
        {
            get { return _idAfastamento; }
            set { _idAfastamento = value; }
        }
        public int IdPessoa
        {
            get { return _idPessoa; }
            set { _idPessoa = value; }
        }
        public TipoAfastamento TipoAfastamento
        {
            get { return _tipoAfastamento; }
            set { _tipoAfastamento = value; }
        }
        public TipoMotivoAfastamento TipoMotivoAfastamento
        {
            get { return _motivoAfastamento; }
            set { _motivoAfastamento = value; }
        }
        public DateTime? PeriodoInicial
        {
            get { return _periodoInicial; }
            set { _periodoInicial = value; }
        }
        public DateTime? PeriodoFinal
        {
            get { return _periodoFinal; }
            set { _periodoFinal = value; }
        }
        public DateTime? PeriodoFinalReal
        {
            get { return _periodoFinalReal; }
            set { _periodoFinalReal = value; }
        }
        public string Path
        {
            get { return _path; }
            set { _path = value; }
        }
        public string Observacoes
        {
            get { return _observacoes; }
            set { _observacoes = value; }
        }
        public int IdAtestadoPai
        {
            get { return _idAtestadoPai; }
            set { _idAtestadoPai = value; }
        }
        #endregion

        #region Construtores
        public PessoaAfastamento()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public PessoaAfastamento(int idAfastamento)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idAfastamento);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados
        private void Carregar(int idAfastamento)
        {
            try
            {
                var consulta = from afast in _context.tab_pessoa_atestado
                               where afast.tab_tipo_atestado.id_tipo_atestado == _idTipoAfastamento
                               && afast.id_atestado == idAfastamento
                               select new
                               {
                                   id_afastamento = afast.id_atestado,
                                   afast.tab_pessoa.Id_pessoa,
                                   afast.tab_tipo_afastamento.id_tipo_afastamento,
                                   afast.tab_tipo_motivo_afastamento.id_motivo_afastamento,
                                   afast.periodo_inicial,
                                   afast.periodo_final,
                                   afast.periodo_final_real,
                                   afast.obs,
                                   afast.path,
                                   id_atestado_pai = afast.tab_pessoa_atestado2.id_atestado == null ? 0 : afast.tab_pessoa_atestado2.id_atestado
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.IdAfastamento = list.id_afastamento;
                    this.IdPessoa = list.Id_pessoa;
                    this.TipoAfastamento = new TipoAfastamento(list.id_tipo_afastamento);
                    this.TipoMotivoAfastamento = new TipoMotivoAfastamento(list.id_motivo_afastamento);
                    this.PeriodoInicial = list.periodo_inicial;
                    this.PeriodoFinal = list.periodo_final;
                    this.PeriodoFinalReal = list.periodo_final_real;
                    this.Path = list.path;
                    this.IdAtestadoPai = list.id_atestado_pai;
                    this.Observacoes = list.obs;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        protected void RecuperaId()
        {
            try
            {
                var consulta = from afast in _context.tab_pessoa_atestado
                               where afast.tab_tipo_atestado.id_tipo_atestado == _idTipoAfastamento
                               && afast.tab_tipo_afastamento.id_tipo_afastamento == this.TipoAfastamento.IdTipoAfastamento
                               && afast.tab_tipo_motivo_afastamento.id_motivo_afastamento == this.TipoMotivoAfastamento.IdMotivoAfastamento
                               && afast.periodo_inicial == this.PeriodoInicial
                               && afast.periodo_final == this.PeriodoFinal
                               && afast.periodo_final_real == this.PeriodoFinalReal
                               && afast.obs == this.Observacoes
                               orderby afast.id_atestado descending
                               select afast;

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.IdAfastamento = list.id_atestado;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Publicos

        #region Metodos de Selecao
        public List<PessoaAfastamento> SelectAll()
        {
            try
            {
                List<PessoaAfastamento> listAfastamento = new List<PessoaAfastamento>();

                var consulta = from afast in _context.tab_pessoa_atestado
                               where afast.tab_tipo_atestado.id_tipo_atestado == _idTipoAfastamento
                               select new
                               {
                                   id_afastamento = afast.id_atestado,
                                   afast.tab_pessoa.Id_pessoa,
                                   afast.tab_tipo_afastamento.id_tipo_afastamento,
                                   afast.tab_tipo_motivo_afastamento.id_motivo_afastamento,
                                   afast.periodo_inicial,
                                   afast.periodo_final,
                                   afast.periodo_final_real,
                                   afast.obs,
                                   afast.path,
                                   id_atestado_pai = afast.tab_pessoa_atestado2.id_atestado == null ? 0 : afast.tab_pessoa_atestado2.id_atestado
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaAfastamento afastamento = new PessoaAfastamento();
                    afastamento.IdAfastamento = list.id_afastamento;
                    afastamento.IdPessoa = list.Id_pessoa;
                    afastamento.TipoAfastamento = new TipoAfastamento(list.id_tipo_afastamento);
                    afastamento.TipoMotivoAfastamento = new TipoMotivoAfastamento(list.id_motivo_afastamento);
                    afastamento.PeriodoInicial = list.periodo_inicial;
                    afastamento.PeriodoFinal = list.periodo_final;
                    afastamento.PeriodoFinalReal = list.periodo_final_real;
                    afastamento.Path = list.path;
                    afastamento.IdAtestadoPai = list.id_atestado_pai;
                    afastamento.Observacoes = list.obs;

                    listAfastamento.Add(afastamento);
                }

                return listAfastamento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<PessoaAfastamento> SelectPor(int idPessoa)
        {
            try
            {
                List<PessoaAfastamento> listAfastamento = new List<PessoaAfastamento>();

                var consulta = from afast in _context.tab_pessoa_atestado
                               where afast.tab_tipo_atestado.id_tipo_atestado == _idTipoAfastamento
                               && afast.tab_pessoa.Id_pessoa == idPessoa
                               select new
                               {
                                   id_afastamento = afast.id_atestado,
                                   afast.tab_pessoa.Id_pessoa,
                                   afast.tab_tipo_afastamento.id_tipo_afastamento,
                                   afast.tab_tipo_motivo_afastamento.id_motivo_afastamento,
                                   afast.periodo_inicial,
                                   afast.periodo_final,
                                   afast.periodo_final_real,
                                   afast.obs,
                                   afast.path,
                                   id_atestado_pai = afast.tab_pessoa_atestado2.id_atestado == null ? 0 : afast.tab_pessoa_atestado2.id_atestado
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    PessoaAfastamento afastamento = new PessoaAfastamento();
                    afastamento.IdAfastamento = list.id_afastamento;
                    afastamento.IdPessoa = list.Id_pessoa;
                    afastamento.TipoAfastamento = new TipoAfastamento(list.id_tipo_afastamento);
                    afastamento.TipoMotivoAfastamento = new TipoMotivoAfastamento(list.id_motivo_afastamento);
                    afastamento.PeriodoInicial = list.periodo_inicial;
                    afastamento.PeriodoFinal = list.periodo_final;
                    afastamento.PeriodoFinalReal = list.periodo_final_real;
                    afastamento.Path = list.path;
                    afastamento.IdAtestadoPai = list.id_atestado_pai;
                    afastamento.Observacoes = list.obs;

                    listAfastamento.Add(afastamento);
                }

                return listAfastamento;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos de Persistencia
        public void Salvar()
        {
            try
            {
                if (this.IdAfastamento == 0)
                {
                    tab_pessoa_atestado tabAfastamento = new tab_pessoa_atestado();
                    tabAfastamento.tab_pessoaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa", "Id_pessoa", this.IdPessoa);
                    tabAfastamento.tab_tipo_atestadoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_atestado", "id_tipo_atestado", _idTipoAfastamento);
                    tabAfastamento.tab_tipo_afastamentoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_afastamento", "id_tipo_afastamento", this.TipoAfastamento.IdTipoAfastamento);
                    tabAfastamento.tab_tipo_motivo_afastamentoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_motivo_afastamento", "id_motivo_afastamento", this.TipoMotivoAfastamento.IdMotivoAfastamento);
                    tabAfastamento.periodo_inicial = this.PeriodoInicial;
                    tabAfastamento.periodo_final = this.PeriodoFinal;
                    tabAfastamento.periodo_final_real = this.PeriodoFinalReal;
                    tabAfastamento.obs = this.Observacoes;
                    if (this.IdAtestadoPai != 0)
                        tabAfastamento.tab_pessoa_atestado2Reference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa_atestado", "id_atestado", this.IdAtestadoPai);

                    _context.AddTotab_pessoa_atestado(tabAfastamento);
                    _context.SaveChanges();

                    RecuperaId();
                    SalvaGerouAfastamento();
                }
                else
                {
                    tab_pessoa_atestado tabAfastamento = (from afast in _context.tab_pessoa_atestado
                                                          where afast.id_atestado == this.IdAfastamento
                                                          select afast).First();

                    tabAfastamento.tab_pessoaReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa", "Id_pessoa", this.IdPessoa);
                    tabAfastamento.tab_tipo_atestadoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_atestado", "id_tipo_atestado", _idTipoAfastamento);
                    tabAfastamento.tab_tipo_afastamentoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_afastamento", "id_tipo_afastamento", this.TipoAfastamento.IdTipoAfastamento);
                    tabAfastamento.tab_tipo_motivo_afastamentoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_motivo_afastamento", "id_motivo_afastamento", this.TipoMotivoAfastamento.IdMotivoAfastamento);
                    tabAfastamento.periodo_inicial = this.PeriodoInicial;
                    tabAfastamento.periodo_final = this.PeriodoFinal;
                    tabAfastamento.periodo_final_real = this.PeriodoFinalReal;
                    tabAfastamento.obs = this.Observacoes;
                    if (this.IdAtestadoPai != 0)
                        tabAfastamento.tab_pessoa_atestado2Reference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_pessoa_atestado", "id_atestado", this.IdAtestadoPai);

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void AtualizaPath()
        {
            try
            {
                if (this.IdAfastamento != 0)
                {
                    tab_pessoa_atestado tabAfastamento = (from afast in _context.tab_pessoa_atestado
                                                  where afast.tab_tipo_atestado.id_tipo_atestado == _idTipoAfastamento
                                                  && afast.id_atestado == this.IdAfastamento
                                                  select afast).First();

                    tabAfastamento.path = this.Path;

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void SalvaGerouAfastamento()
        {
            try
            {
                if (this.IdAtestadoPai != 0)
                {
                    tab_pessoa_atestado tabAtestado = (from atest in _context.tab_pessoa_atestado
                                                       where atest.id_atestado == this.IdAtestadoPai
                                                       select atest).First();

                    tabAtestado.g_afastamento = "S";

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void Excluir()
        {
            try
            {
                if (this.IdAfastamento != 0)
                {
                    tab_pessoa_atestado tabAfastamento = (from afast in _context.tab_pessoa_atestado
                                                          where afast.id_atestado == this.IdAfastamento
                                                          select afast).First();

                    _context.DeleteObject(tabAfastamento);
                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion
    }
}
